home *** CD-ROM | disk | FTP | other *** search
- #include <FileMgr.h>
- #include <MacTypes.h>
- #include <string.h>
- #include <MemoryMgr.h>
- #include <SerialDvr.h>
- #include "xcmd.h"
-
- void setreturn(XCmdBlockPtr,char *);
- Handle CopyStrToHand(char *);
-
- #define Mzero 34
- #define Azero 48
-
-
- #ifdef XTEST
- pascal void xserial(block)
- #else
- pascal void main(block)
- #endif
- register XCmdBlockPtr block;
-
- {
- #define Bufsz 64
- short port;
- unsigned short baud;
- short databits;
- short stopbits;
- short parity;
- short handshake;
- short config;
- short error;
- short inport;
- short outport;
- char endline[5];
- char *s;
- short i;
- long length;
- SerShk shake;
-
- char inbuf[Bufsz];
-
- error = 0; /* no error */
- setreturn(block,"None");
- switch (block->paramCount)
- {
- case 0: /* receive string */
- inport = block->utillong1;
- SerGetBuf(inport,&length);
- if (length)
- {
- if (length < Bufsz)
- {
- FSRead(inport,&length,inbuf);
- inbuf[length] = 0; /* null terminate to make a C string */
- setreturn(block,inbuf);
- }
- }
- else
- setreturn(block,"No data");
- break;
-
- case 1: /* send string */
- endline[0] = 13;
- endline[1] = 10;
- endline[2] = 0;
- outport = block->utillong2;
- s = (char *)*(block->params[0]);
- length = s_len(s);
- error = FSWrite(outport,&length,s);
- /* length = s_len(endline);
- error = FSWrite(outport,&length,endline);*/
- if (error)
- setreturn(block,"Write error");
- return;
- break;
-
- case 7: /* initialize */
- port = (short) HandleToNum(block,block->params[0]);
- baud = (short) HandleToNum(block,block->params[1]);
- parity = *(char *)*(block->params[2]);
- databits = (short) HandleToNum(block,block->params[3]);
- stopbits = (short) HandleToNum(block,block->params[4]);
- handshake = *(char *)*(block->params[5]);
- s = (char *)*(block->params[6]);
- i = 0;
- while (s[i])
- {
- switch(s[i])
- {
- case 'R' : endline[i] = 13; break;
- case 'L' : endline[i] = 10; break;
- }
- i++;
- }
- endline[i] = 0;
-
- switch (baud)
- {
- case 300 : baud = 380; break;
- case 600 :
- case 1200: baud = 94; break;
- case 1800:
- case 2400: baud = 46; break;
- case 3600:
- case 4800: baud = 22; break;
- case 7200:
- case 9600: baud = 18; break;
- case 19200: baud = 4; break;
- case 57600:
- default : baud = 94; break;
- }
-
- switch (parity)
- {
- case 'N' : parity = 8192; break;
- case 'O' : parity = 12288; break;
- case 'E' : parity = 4096; break;
- default : parity = 8192; break;
- }
-
- switch (databits)
- {
- case 7 : databits = 1024; break;
- case 8 : databits = 3072; break;
- default: databits = 3072; break;
- }
-
- switch (stopbits)
- {
- case 1 : stopbits = 16384; break;
- case 2 : stopbits = -16384; break;
- default: stopbits = 16384; break;
- }
-
- switch (handshake)
- {
- case 'H' :
- case 'S' :
- case 'N' :
- default : shake.fXOn = 0;
- shake.fCTS = 0;
- shake.xOn = 0;
- shake.xOff = 0;
- shake.errs = 0;
- shake.evts = 0;
- shake.fInX = 0;
- shake.fDTR = 0;
- }
-
- config = baud + parity + databits + stopbits;
-
- switch (port)
- {
- case 1 :
- inport = -6;
- outport = -7;
- error = RAMSDOpen(sPortA);
- break;
- case 2 :
- inport = -8;
- outport = -9;
- error = RAMSDOpen(sPortB);
- break;
- }
-
- if (error)
- {
- setreturn(block,"Can't open driver");
- }
- else
- {
- error = SerReset(inport,config);
- if (error)
- setreturn(block,"Can't set in port");
- else
- {
- error = SerReset(outport,config);
- if (error)
- setreturn(block,"Can't set in port");
- else
- {
- error = SerHShake(inport,&shake) + SerHShake(outport,&shake);
- if (error)
- setreturn(block,"Can't set handshaking");
- else
- {
- block->utillong1 = inport;
- block->utillong2 = outport;
- }
- }
- }
- }
- }
- }
-
-
-
- void setreturn(block,s)
- XCmdBlockPtr block;
- char *s;
- {
- block->returnValue = (Handle) CopyStrToHand(s);
- }
-
- Handle CopyStrToHand(s)
- char *s;
- {
- Handle h;
-
- h = (Handle)NewHandle((long) s_len(s) + 1);
- s_copy ((char *)(*h),s);
- return(h);
- }
-
-
-
-
-